[JRuby]ActiveRecord JDBC Adapterを使いMySQLに接続する
はじめに
JRubyを使い、MySQLに接続してデータを操作する方法について調べました。幾つか方法はあるようなのですが、RailsのActiveRecordと同じようにデータを操作できるActiveRecord JDBC Adapterを使ってみました。以下、その実装方法とサンプルソースについて書いてみたいと思います。
環境について
今回は以下の環境で検証しました。
- jruby 9.0.0.0
- java version "1.8.0_25"
実装方法とソースについて
では実装についてです。まずはGemfileを編集し、必要なGemをインストールします。
source "https://rubygems.org" gem 'activerecord', '~> 3.2.18' gem 'activerecord-jdbcmysql-adapter' gem 'warbler'
3、4行目がActiveRecord JDBC Adapterに関する記述です。6行目は今回とは直接関係ありませんが、jarを作成するためwarblerというGemです。
上記を記述したら、以下のコマンドでインストールします。
$ bundle install --path vendor/bundle
次にMySQLに接続し、データを操作するソースです。
# encoding: utf-8 require "jdbc/mysql" require "java" require "active_record" Jdbc::MySQL.load_driver(:require) if Jdbc::MySQL.respond_to?(:load_driver) module JrubyMysqlSample config = { url: 'jdbc:mysql://domain:3306/database_name', adapter: 'jdbc', username: 'username', password: 'password', driver: 'com.mysql.jdbc.Driver', } ActiveRecord::Base.establish_connection(config) class Groups < ActiveRecord::Base end class << self def main create find delete rescue => e puts e.message end private def create group = Groups.new group[:company] = 'クラスメソッド' group[:section] = 'テスト用' group[:deleted] = 0 group.save end def find groups = Groups.find(:all, :conditions => ["company = ?", 'クラスメソッド']) groups.each do |group| puts group[:id].to_s + ',' + group[:company] + ',' + group[:section] end end def delete groups = Groups.find(:all, :conditions => ["company = ? and section = ?", 'クラスメソッド', 'テスト用']) groups.each do |group| group.destroy end end end end
3〜18行目がActiveRecord JDBC Adapterを使用する際のポイントとなります。3〜5行目で必要なものをrequireで取り込みます。7行目でMySQLのドライバをロードし、10〜18行目でMySQLへの接続情報を渡しています。
1行目はActiveRecord JDBC Adapterとは関係ありません(笑)。warblerでjarを作成した際、日本語が文字化けしないようにするために入れてあります。
20行目以降は一般的なActiveRecordと同じソースとなります。24行目以降のmain()内でcreate・find・deleteを呼び出し、それぞれのメソッド内でデータの作成・取得・削除を行っています。データの操作対象となるのは「Groups」テーブルで、20行目でActiveRecordクラスを継承してModelを作成しています。
なお、実際にはmain()を外部から呼び出して実行しました(mainの呼び出しについては省略します)。
まとめ
簡単でしたが以上です。JDBCのドライバを使っているため、他のデータベースに接続することもできそうです。
参考サイト
activerecord-jdbc-adapter
JRuby: connect to a MSSQL database via ActiveRecord and create ActiveRecord::Base classes
cannot load Java class com.mysql.jdbc.Driver
JRubyでSyntaxError: test.rb:1: invalid multibyte char (US-ASCII)